package scheduler.core;

import java.util.ArrayList;
import java.util.List;
import scheduler.core.task.TaskPool;
import scheduler.core.task.Taskj;
import scheduler.core.utils.TaskPoolValidationException;
import scheduler.core.utils.TaskjValidationException;
import scheduler.core.utils.ValidationException;

/**
 * Використовується, якщо вхідні данні задаються у відповідності до 1-го способу (див. завдання).
 * @author Volodymyr Pogorelov
 */
public class TaskProcessor extends Processor {
    public TaskProcessor(int numOfPriors, List<Taskj> tasks) throws TaskPoolValidationException, ValidationException, TaskjValidationException {
        if(numOfPriors < 1){
            throw new ValidationException(ValidationException.ErrorType.INVALID_NUMBER_OF_PRIORITIES, 
                        "Кількість пріорітетів повинна бути додатнім числом");
        }
        poolList = new ArrayList<>(numOfPriors);
        for(int i = 0; i < numOfPriors; i++){
            poolList.add(new TaskPool(i+1, 16));
            poolMap.put(i + 1, poolList.get(i));
        }
        for(Taskj taskj : tasks){
            int prior = taskj.getPrior();
            if(prior > numOfPriors) {
                throw new TaskjValidationException(taskj.getId(), TaskjValidationException.ErrorType.INVALID_PRIORITY,
                        "Пріорітет задачі повинен бути в діапазоні від 1 до " + numOfPriors + ".");
            }
            ((TaskPool)poolList.get(prior - 1)).addTask(taskj);
        }
        for(int i = 0; i < numOfPriors; i++){
            if(poolMap.get(i + 1).getN() == 0){
                poolMap.remove(i + 1);
                poolList.remove(new TaskPool(i+1, 16));
            }
        }
    }
}
